package com.qqt.csr.ixport.assembler;

import cn.hutool.core.bean.BeanUtil;
import com.qqt.csr.common.acl.aics.resp.CsMemberInfoDTO;
import com.qqt.csr.common.exception.BaseException;
import com.qqt.csr.common.session.SessionContextHolder;
import com.qqt.csr.common.utils.SnowflakeUtil;
import com.qqt.csr.ixport.entity.BatchImportTask;
import com.qqt.csr.ixport.enums.TaskStatus;
import com.qqt.csr.ixport.enums.TaskType;
import com.qqt.csr.ixport.vo.req.CreatingImportTaskReqVO;
import com.qqt.csr.ixport.vo.resp.ImportTaskInfoRespVO;
import org.apache.commons.lang3.StringUtils;

import java.util.Optional;

/**
 * @Author: yang hao
 * @Date: 2025/1/20 9:50
 * @Description: 批量导入任务 装配器
 **/
public class BatchImportTaskAssembler {

    /**
     * 请求参数转实体
     * @param reqVO 批量导入任务新增请求参数
     * @return 批量导入任务实体
     */
    public static BatchImportTask convert(CreatingImportTaskReqVO reqVO) {
        return BatchImportTask.builder()
                .id(SnowflakeUtil.nextId())
                .tenantId(getCurrentTenantId())
                .type(reqVO.getType().getCode())
                .businessCode(reqVO.getBusinessCode())
                .retryTimesCfg(getRetryCount(reqVO.getRetryTimesCfg()))
                .status(TaskStatus.UN_START.getCode())
                .retryTimes(initRetryTimes())
                .dataTotal(0)
                .successCount(0)
                .dataSourceDownUrl(reqVO.getDataSourceDownUrl())
                .creatorId(getCurrentUserId())
                .name(reqVO.getName())
                .build();
    }

    /**
     * 实体转返回参数
     * @param entity 批量导入任务实体
     * @return 批量导入任务返回参数
     */
    public static ImportTaskInfoRespVO convert(BatchImportTask entity, CsMemberInfoDTO memberInfoDTO) {
        if(entity == null){
            return null;
        }
        ImportTaskInfoRespVO vo = BeanUtil.copyProperties(entity, ImportTaskInfoRespVO.class);
        vo.setType(TaskType.match(entity.getType()));
        vo.setStatus(TaskStatus.match(entity.getStatus()));
        vo.setCreatorName(Optional.ofNullable(memberInfoDTO).map(CsMemberInfoDTO::getNickName).orElse(StringUtils.EMPTY));
        return vo;
    }

    /**
     * 实体转返回参数
     * @param entity 批量导入任务实体
     * @return 批量导入任务返回参数
     */
    public static ImportTaskInfoRespVO convert(BatchImportTask entity, String creatorName) {
        if(entity == null){
            return null;
        }
        ImportTaskInfoRespVO vo = BeanUtil.copyProperties(entity, ImportTaskInfoRespVO.class);
        vo.setType(TaskType.match(entity.getType()));
        vo.setStatus(TaskStatus.match(entity.getStatus()));
        vo.setCreatorName(creatorName);
        return vo;
    }

    /**
     * 已重试次数初始化
     * @return 已重试次数初始化
     */
    private static int initRetryTimes() {
        return 0;
    }

    /**
     * 获取重试次数
     * @param retryCount 重试次数
     * @return 重试次数
     */
    private static int getRetryCount(Integer retryCount) {
        return retryCount == null ? 3 : retryCount;
    }

    /**
     * 获取当前租户id
     * @return 当前租户id
     */
    private static String getCurrentTenantId() {
        if (SessionContextHolder.getHeaderInfo() == null) {
            throw new BaseException("当前账户信息为空");
        }
        String currentTenantId = SessionContextHolder.getHeaderInfo().getTenantId();
        if (currentTenantId == null) {
            throw new BaseException("当前租户为空");
        }
        return currentTenantId;
    }

    /**
     * 获取当前用户id
     * @return 当前用户id
     */
    private static Long getCurrentUserId() {
        if (SessionContextHolder.getHeaderInfo() == null) {
            throw new BaseException("当前账户信息为空");
        }
        Long currentUserId = SessionContextHolder.getHeaderInfo().getUserId();
        if (currentUserId == null) {
            throw new BaseException("当前用户为空");
        }
        return currentUserId;
    }

}
